package com.mlick.a.leetcode;


/*
给你一个长度为 n 下标从 0 开始的字符串 blocks ，blocks[i] 要么是 'W' 要么是 'B' ，表示第 i 块的颜色。字符 'W' 和 'B' 分别表示白色和黑色。

给你一个整数 k ，表示想要 连续 黑色块的数目。

每一次操作中，你可以选择一个白色块将它 涂成 黑色块。

请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。

 

示例 1：

输入：blocks = "WBBWWBBWBW", k = 7
输出：3
解释：
一种得到 7 个连续黑色块的方法是把第 0 ，3 和 4 个块涂成黑色。
得到 blocks = "BBBBBBBWBW" 。
可以证明无法用少于 3 次操作得到 7 个连续的黑块。
所以我们返回 3 。
示例 2：

输入：blocks = "WBWBBBW", k = 2
输出：0
解释：
不需要任何操作，因为已经有 2 个连续的黑块。
所以我们返回 0 。
 

提示：

n == blocks.length
1 <= n <= 100
blocks[i] 要么是 'W' ，要么是 'B' 。
1 <= k <= n

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/minimum-recolors-to-get-k-consecutive-black-blocks
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class A2379 {

    class Solution {
        /**
         * 解题思路：采用滑动窗口法
         * 固定窗口，逐步往后查找
         * 自我实现
         */
        public int minimumRecolors(String blocks, int k) {

            int min = Integer.MAX_VALUE, flag;
            for (int i = 0; i < blocks.length(); i++) {
                flag = 0;
                for (int j = i; j < i + k; j++) {
                    if (j > blocks.length() - 1) {
                        flag = -1;
                        break;
                    }
                    if (blocks.charAt(j) == 'W') {
                        flag++;
                    }
                }
                if (min > flag && flag != -1) {
                    min = flag;
                }
            }

            return min;
        }
    }

    class Solution2 {
        /**
         * 网上解决思路 2， 滑动窗口, 首取出当前窗口的个数，然后再逐次往后查找,性能更好一些
         */
        public int minimumRecolors(String blocks, int k) {

            int cc = 0;
            for (int i = 0; i < k; i++) {
                cc += blocks.charAt(i) == 'W' ? 1 : 0;
            }

            int min = cc;
            for (int i = k; i < blocks.length(); i++) {
                cc += blocks.charAt(i) == 'W' ? 1 : 0;
                cc -= blocks.charAt(i - k) == 'W' ? 1 : 0;
                min = Math.min(cc, min);
            }

            return min;
        }

    }


}
